package com.cskaoyan.javase.string._2constant;

/**
 * @description: 字符串常量池
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 引入:
 * 回想一下"hello"是一个什么东西?
 *      1.字面值常量
 *      2.String对象
 * 在Java当中所有的双引号引起来的字面值常量字符串,编译器在编译时期就能够确定它的最终状态(结合不可变性)
 *      所以Java引入了常量池的概念:
 *          字面值常量字符串在程序的编译时期,会自动加入静态常量池,作为一个对象(静态常量池实际上就是二进制的字节码文件)
 *          而随着程序的执行,在类加载时期,JVM会把静态常量池中字面值常量字符串作为一个对象在运行时常量池(字符串常量池)中创建
 *          字符串常量池在堆上(Java8之后)
 *
 * 案例:
 *      String s1 = "我是神";
 *      String s = new String("我是神");
 *
 * String设计成不可变,并且使用常量池的概念,主要是为了: 共享
 * 因为不可变,所以才可以共享,不可变的特性是共享的前提
 * 共享后的优点显而易见,最明显的节省空间,其次还有安全,最后不可变后还带来了效率的提升(尤其是在哈希表中)
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        String s1 = "我是神";
        String s2 = "我是神";
        //s1,s2共用一个对象
        String s = new String("我是神");
    }
}
